<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // Symbol起源
    // ES5 的对象属性名都是字符串，这容易造成属性名的冲突。比如，你使用了一个他人提供的对象，但又想为这个对象添加新的方法（mixin 模式），新方法的名字就有可能与现有方法产生冲突。如果有一种机制，保证每个属性的名字都是独一无二的就好了，这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

    // ES5 的对象属性名都是字符串，这容易造成属性名的冲突
    // var zhang = { name: "张三", age: 18, height: "177cm", weight: "70kg" };

    // 新增属性  => 对应属性名赋值,没有就新增, 有就修改
    // zhang["sex"] = "男";
    // zhang["name"] = "李四";
    // console.log(zhang);

    // 你使用了一个他人提供的对象，但又想为这个对象添加新的方法（mixin 模式），新方法的名字就有可能与现有方法产生冲突
    // Math  => 数学对象 存储数学相关的属性和方法

    // Math._randInt = function(min = 0,max = 100){
    //     return min + Math.round(Math.random()*(max-min));
    // }
    // Math._randInt();
    // console.log(Math);

    // 如果有一种机制，保证每个属性的名字都是独一无二的就好了，这样就从根本上防止属性名的冲突


    // ES6 引入了一种新的原始数据类型Symbol，表示独一无二的值。

    // 如何创建Symbol数据  => 需要借助一个Symbol函数
    // Symbol()  调用此方法创建一个独一无二的值
    // var s1 = Symbol()
    // console.log(s1,typeof s1);

    // var s2 = Symbol()
    // console.log(s2,typeof s2);

    // console.log(s1 === s2);  //  表示独一无二的值 false

    // Symbol()函数可以接受一个字符串作为参数，表示对 Symbol 实例的描述。这主要是为了在控制台显示，或者转为字符串时，比较容易区分。

    // var s1 = Symbol("a")
    // console.log(s1,typeof s1);

    // var s2 = Symbol("b")
    // console.log(s2,typeof s2);

    // console.log(s1 === s2);  //  表示独一无二的值 false

    // Symbol数据可以通过 toString()转化为字符串
    // var s1 = Symbol("a")
    // console.log(s1,s1.toString());  // Symbol(a) 转字符串 'Symbol(a)'

    // var s2 = Symbol("a")
    // console.log(s2,s1.toString());

    // console.log(s1.toString() === s1.toString());


    // 我们也可以通过description 属性获取 Symbol数据的描述
    var s1 = Symbol("a")
    console.log(s1.description);
    var s2 = Symbol("b")
    console.log(s2.description);




</script>
</html>